package inf319;

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;

/**
 * Classe que implementa a interface gráfica que permite manipular o 
 * 'hardware' e observar o funcionamento da cafeteira.
 */
public class JanelaCafeteira extends JFrame 
        implements ActionListener, ItemListener {
    
    private static final long serialVersionUID = -865097671714426223L;

    private Hardware cafeteira;

    private JLabel labelEbulidor;
    private JLabel labelValvula;
    private JLabel labelAquecedor;
    private JLabel labelIndicadora;
    private JProgressBar progressCafe;
    private JProgressBar progressAgua;
    private JCheckBox checkJarra;

    private boolean ready;
    
    public JanelaCafeteira(Hardware oHardware) {
        super();
        cafeteira = oHardware;
        ready = false;
    }

    public void preparaJanela() {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                prepara();
            }
        });
    }
    
    protected void prepara() {
        // Prepara frame principal
        setResizable(false);
        setTitle("Cafeteira CafeBemBrasileiro");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // Instancia componentes da interface
        labelEbulidor = new JLabel();
        labelValvula = new JLabel();
        labelAquecedor = new JLabel();
        labelIndicadora = new JLabel();

        progressAgua = new JProgressBar(0, 50);
        JButton buttonTirarAgua = new JButton("-");
        buttonTirarAgua.setActionCommand("tirarAgua");
        buttonTirarAgua.addActionListener(this);
        JButton buttonPorAgua = new JButton("+");
        buttonPorAgua.setActionCommand("porAgua");
        buttonPorAgua.addActionListener(this);
        JPanel controleAgua = new JPanel();
        controleAgua.setLayout(new FlowLayout(FlowLayout.LEFT));
        controleAgua.add(new JLabel("Água no Reservatório"));
        controleAgua.add(buttonTirarAgua);
        controleAgua.add(buttonPorAgua);
        
        progressCafe = new JProgressBar(0, 50);
        JButton buttonTirarCafe = new JButton("-");
        buttonTirarCafe.setActionCommand("tirarCafe");
        buttonTirarCafe.addActionListener(this);
        JButton buttonPorCafe = new JButton("+");
        buttonPorCafe.setActionCommand("porCafe");
        buttonPorCafe.addActionListener(this);
        JPanel controleCafe = new JPanel();
        controleCafe.setLayout(new FlowLayout(FlowLayout.LEFT));
        controleCafe.add(new JLabel("Café na Jarra"));
        controleCafe.add(buttonTirarCafe);
        controleCafe.add(buttonPorCafe);

        checkJarra = new JCheckBox("Jarra na Cafeteira", true);
        checkJarra.addItemListener(this);

        JButton buttonFazer = new JButton("Fazer Café");
        buttonFazer.setActionCommand("buttonFazer");
        buttonFazer.addActionListener(this);
        
        
        // Prepara painel dos estados do hardware
        JPanel p1 = new JPanel(new GridLayout(4,1));
        p1.add(labelEbulidor);
        p1.add(labelValvula);
        p1.add(labelAquecedor);
        p1.add(labelIndicadora);
        
        // Prepara o painel dos reservatorios
        JPanel p2 = new JPanel();
        p2.setLayout(new GridLayout(5,1));
        p2.add(progressAgua);
        p2.add(controleAgua);
        p2.add(progressCafe);
        p2.add(controleCafe);
        p2.add(checkJarra);
        
        // Prepara o painel principal
        JPanel p3 = new JPanel();
        p3.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        p3.setLayout(new GridLayout(1,2));
        p3.add(p1);
        p3.add(p2);
        p3.setAlignmentX(Component.CENTER_ALIGNMENT);
        JPanel p4 = new JPanel();
        p4.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
        p4.add(buttonFazer);
        p4.setAlignmentX(Component.CENTER_ALIGNMENT);
        getContentPane().setLayout(
                new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
        getContentPane().add(p3);
        getContentPane().add(p4);

        pack();
        setVisible(true);
        ready = true;
        atualizaEstado();
    }

    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();
        if ("buttonFazer".equals(command)) {
            cafeteira.pressionaBotao();
        } else if ("porAgua".equals(command)) {
            cafeteira.ajustaNivelDeAgua(cafeteira.pegaNivelDeAgua() + 1);
        } else if ("tirarAgua".equals(command)) {
            cafeteira.ajustaNivelDeAgua(cafeteira.pegaNivelDeAgua() - 1);
        } else if ("porCafe".equals(command)) {
            cafeteira.ajustaNivelDeCafe(cafeteira.pegaNivelDeCafe() + 1);
        } else if ("tirarCafe".equals(command)) {
            cafeteira.ajustaNivelDeCafe(cafeteira.pegaNivelDeCafe() - 1);
        }
    }

    public void itemStateChanged(ItemEvent e) {
        if (checkJarra.equals(e.getItemSelectable())) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                cafeteira.colocaJarra();
            } else if (e.getStateChange() == ItemEvent.DESELECTED) {
                cafeteira.removeJarra();
            }
        }
    }
    
    public void atualizaEstado() {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                atualiza();
            }
        });
    }
        
    protected void atualiza() {
        if (ready) {
            if (cafeteira.leEstadoElementoEbulidor().equals(
                    EstadoHardware.ebulidorLigado)) {
                labelEbulidor.setText("Ebulidor Ligado");
            } else {
                labelEbulidor.setText("Ebulidor Desligado");
            }
            
            if (cafeteira.leEstadoValvulaPressao().equals(
                    EstadoHardware.valvulaAberta)) {
                labelValvula.setText("Válvula de Pressão Aberta");
            } else {
                labelValvula.setText("Válvula de Pressão Fechada");
            }
            
            if (cafeteira.leEstadoElementoAquecedor().equals(
                    EstadoHardware.aquecedorLigado)) {
                labelAquecedor.setText("Aquecedor Ligado");
            } else {
                labelAquecedor.setText("Aquecedor Desligado");
            }
            
            if (cafeteira.leEstadoLuzIndicadora().equals(
                    EstadoHardware.indicadoraAmarela)) {
                labelIndicadora.setText("Luz Indicadora Amarela");
            } else if (cafeteira.leEstadoLuzIndicadora().equals(
                    EstadoHardware.indicadoraVerde)) {
                labelIndicadora.setText("Luz Indicadora Verde");
            }else {
                labelIndicadora.setText("Luz Indicadora Desligada");
            }
            
            progressAgua.setValue(cafeteira.pegaNivelDeAgua());
            progressCafe.setValue(cafeteira.pegaNivelDeCafe());
        }
    }
}
